package com.hyz.service.permission;

import com.hyz.model.dto.AmUpdateAssetMaintenanceRequest;
import com.hyz.model.dto.ApprovalResultRequest;
import com.hyz.model.dto.InsAssetImportRequest;
import com.hyz.model.dto.InsertAssetOutboundRequest;
import com.hyz.model.vo.*;
import org.springframework.web.bind.annotation.RequestBody;
import pojo.ResponseResult;
import pojo.asset.repository.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author HGD
 * @date 2022/10/8 0:02
 */
public interface AssetManagerService {
    // ----------------------------------------------------------------
    // 资产入库

    /**
     * 资产管理员获取未入库资产集合
     *
     * @return 未入库资产集合
     */
    ResponseResult<List<AssetResponse>> getUnassignedAsset();

    /**
     * 资产管理员查询对应资产可入库的仓库列表
     *
     * @param assetId 对应资产
     * @return 可入库的仓库列表
     */
    ResponseResult<List<Repository>> getEnableImportRepositories(Long assetId);

    /**
     * 资产管理员创建入库申请
     *
     * @param request 用户传入资产id和仓库id
     * @return 返回未分库资产列表
     */
    ResponseResult<List<AssetResponse>> insertAssetImport(@RequestBody InsAssetImportRequest request);

    /**
     * 资产管理员获取资产入库申请
     *
     * @return 入库申请
     */
    ResponseResult<List<AssetImportResponse>> amGetAssetImport();

    // ----------------------------------------------------------------
    // 资产借调

    /**
     * 资产管理员获取资产借调申请
     *
     * @return 资产借调申请
     */
    ResponseResult<List<AssetSecondmentResponse>> amGetAssetSecondments();

    /**
     * 资产管理员获取可分配资产
     *
     * @param assetSecondmentId 资产借调申请id
     * @return 资产列表
     */
    ResponseResult<List<AssetResponse>> getUnLockAssets(Long assetSecondmentId);

    /**
     * 资产管理员为借调申请分配资产并创建资产出库
     *
     * @param request 资产id，借调申请id，资产管理员id
     * @return 资产借调申请
     */
    ResponseResult<List<AssetSecondmentResponse>> insertAssetOutbound(InsertAssetOutboundRequest request);

    /**
     * 资产管理员获取资产出库申请
     *
     * @return 出库申请
     */
    ResponseResult<List<AssetOutboundResponse>> amGetAssetOutbounds();

    /**
     * 资产管理员更新出库申请
     *
     * @param request 资产借调id、是否完成
     * @return 是否审批成功
     */
    ResponseResult<List<AssetOutboundResponse>> amUpdateAssetOutbound(ApprovalResultRequest request);

    /**
     * 资产管理员更新资产借调申请
     *
     * @param request 资产借调申请id、判断结果
     * @return 资产借调申请
     */
    ResponseResult<List<AssetSecondmentResponse>> amUpdateAssetSecondment(ApprovalResultRequest request);

    /**
     * 资产管理员获取资产维修列表
     *
     * @return 资产维修列表
     */
    ResponseResult<List<AssetMaintenanceResponse>> amGetAssetMaintenance();

    // ----------------------------------------------------------------
    // 资产维修

    /**
     * 资产管理员审批维修申请
     *
     * @param request 申请id 申请结果 审批人id
     * @return 资产维修列表
     */
    ResponseResult<List<AssetMaintenanceResponse>> amUpdateAssetMaintenance(AmUpdateAssetMaintenanceRequest request);

    /**
     * 资产管理员获取资产信息
     *
     * @param assetId 资产id
     * @return 资产信息
     */
    ResponseResult<Map<String, AssetResponse>> getAssetById(Long assetId);

    // ----------------------------------------------------------------
    // 资产报废

    /**
     * 资产管理员获取资产报废申请
     *
     * @return 资产报废申请
     */
    ResponseResult<List<AssetRetirementResponse>> amGetAssetRetirement();

    /**
     * 资产管理员审批报废申请
     *
     * @param request 申请id、判断
     * @return 资产报废申请
     */
    ResponseResult<List<AssetRetirementResponse>> amUpdateAssetRetirement(ApprovalResultRequest request);


    /**
     * 资产管理员获取可盘点资产
     *
     * @return 可盘点资产
     */
    ResponseResult<List<AssetResponse>> getInventoryAsset();

    ResponseResult<Object> getImportResult(String importData);
}
